home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / umich / utils / clearmem.arc / bset.asm < prev    next >
Assembly Source File  |  1988-08-19  |  2KB  |  76 lines

  1.  
  2.         public    _bzero        ; Zero a block of memory
  3.         public    _bset        ; Set a block of memory to (byte val)
  4.  
  5.         ;   BSET(buffer, len, byte)
  6.         ;   BZERO(buffer, len)
  7.         ;
  8.         ;   char *buffer;
  9.         ;   long len;
  10.         ;   long byte;     (must be passed as a long though only a byte)
  11.  
  12.         public    _bset
  13.         public    _bzero
  14.  
  15. _bzero:     moveq.l #0,D1
  16.         bra    .bz0
  17. _bset:        move.b    12+3(sp),D1
  18. .bz0        move.l    4(sp),A0
  19.         move.l    8(sp),D0
  20.  
  21.         add.l    D0,A0        ; start at end of address
  22.         cmp.l    #40,D0        ; unscientifically chosen
  23.         bls    .bs2
  24.         bra    .bs10
  25. .bs1        move.b    D1,-(A0)    ; any count < 65536
  26. .bs2        dbf    D0,.bs1
  27.         rts
  28.  
  29.                     ; at least 2 bytes in count (D0)
  30. .bs10        movem.l D2-D7/A2-A6,-(sp)   ;ant count > 4
  31.         move.l    A0,D2
  32.         btst.l    #0,D2        ; is it aligned?
  33.         beq    .bs22
  34.         move.b    D1,-(A0)    ; no, copy one byte
  35.         subq.l    #1,D0
  36.  
  37. .bs22        andi.l    #$FF,D1     ; expand data D1.B -> D2-D7/A1-A6
  38.         move.l    D1,D2        ; D1 000000xx   D2 000000xx
  39.         asl.w    #8,D2        ;               0000xx00
  40.         or.w    D2,D1        ;     0000xxxx
  41.         move.w    D1,D2        ;     0000xxxx      0000xxxx
  42.         swap    D2        ;     0000xxxx      xxxx0000
  43.         or.l    D1,D2        ; D2.L
  44.         move.l    D2,D3
  45.         move.l    D2,D4
  46.         move.l    D2,D5
  47.         move.l    D2,D6
  48.         move.l    D2,D7
  49.         move.l    D2,A1
  50.         move.l    D2,A2
  51.         move.l    D2,A3
  52.         move.l    D2,A4
  53.         move.l    D2,A5
  54.         move.l    D2,A6        ; D2-D7/A1-A6   (12 registers)
  55.         move.l    #12*4,D1    ; bytes per transfer (48)
  56. .bs30        sub.l    D1,D0        ; pre subtract
  57.         bmi    .bs40
  58. .bs31        movem.l D2-D7/A1-A6,-(A0)
  59.         sub.l    D1,D0
  60.         bpl    .bs31
  61. .bs40        add.w    D1,D0        ; less than 48 bytes remaining
  62.  
  63.         move.w    #4,D1        ; by 4's
  64.         sub.w    D1,D0
  65.         bmi    .bs50
  66. .bs41        move.l    D2,-(A0)
  67.         sub.w    D1,D0
  68.         bpl    .bs41
  69. .bs50        add.w    D1,D0
  70.         bra    .bs52
  71. .bs51        move.b    D2,-(A0)    ; by 1's
  72. .bs52        dbf    D0,.bs51
  73.         movem.l (sp)+,D2-D7/A2-A6
  74.         rts
  75.  
  76.